package apis.amapv2.com.handlerthread;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

/**
 * 用通常的方式实现子线程和主线程之间的交互
 */
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //主线程中的Handler
    private Handler.Callback mCallbackMain = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            Toast.makeText(MainActivity.this, "给主线程传递了数据", Toast.LENGTH_SHORT).show();
            return false;
        }
    };
    private Handler mHandlerMain = new Handler(mCallbackMain);

    //子线程中的Handler
    private Handler mHandlerMy;
    //子线程
    private MyThread mMyThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initView();

        //初始化子线程和子线程中的Handler
        initMyHandler();
    }

    private void initView() {
        findViewById(R.id.btn1).setOnClickListener(this);
        findViewById(R.id.btn2).setOnClickListener(this);
    }

    private void initMyHandler() {
        mMyThread = new MyThread();
        mMyThread.start();
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn1) {
            mHandlerMy.sendEmptyMessage(1);//发送一个消息
        } else if (id == R.id.btn2) {
            mMyThread.callMainThread();
        }
    }

    class MyThread extends Thread {
        @Override
        public void run() {
            super.run();

            //1、创建一个消息轮训器

            //1、创建一个消息轮训器，默认情况下是没有这个消息轮训器的
            //2、主线程除外，因为主线程会默认的创建一个消息轮训器、
            //3、Looper对象通过MessageQueue来存放消息，一个线程只能有一个Looper，对应着一个MessageQueue
            Looper.prepare();

            //2、创建一个子线程中对应的Handler
            mHandlerMy = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Toast.makeText(MainActivity.this, "给子线程传递了数据", Toast.LENGTH_SHORT).show();
                }
            };

            //3、让Loop开始工作，从消息队列中取消息，处理消息
            Looper.loop();
        }

        public void callMainThread() {
            mHandlerMain.sendEmptyMessage(2);
        }
    }


}
